package com.chaike.hsq.consts;

import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.Arrays;

/**
 * 慧收钱 支付 枚举.
 *
 * @author Luo
 * @version 1.0
 * @date 2022-01-07 15:22
 */
public class HsqPayEnum {

    /**
     * 请求方法.
     */
    @Getter
    @AllArgsConstructor
    public enum Method {

        /**
         * 小程序下单.
         */
        POLYMERIZE_MAIN_SWEPTN("POLYMERIZE_MAIN_SWEPTN"),

        /**
         * 查询订单（支付结果查询）.
         */
        POLYMERIZE_QUERY("POLYMERIZE_QUERY"),

        /**
         * 申请退款.
         */
        POLYMERIZE_REFUND("POLYMERIZE_REFUND");

        /**
         * code.
         */
        private final String name;

        /**
         * 根据name获取.
         *
         * @param name name
         * @return 结果
         */
        public static Method getByName(final String name) {
            return Arrays.stream(Method.values()).filter(i -> i.getName().equals(name)).findFirst().orElse(null);
        }

    }

    /**
     * 交易状态码.
     */
    @Getter
    @AllArgsConstructor
    public enum OrderStatus {

        /**
         * 初始化.
         */
        INIT("INIT", "初始化"),

        /**
         * 处理中.
         */
        PROCESSING("PROCESSING", "处理中"),

        /**
         * 成功.
         */
        SUCCESS("SUCCESS", "成功"),

        /**
         * 失败.
         */
        FAIL("FAIL", "失败");

        /**
         * status.
         */
        private final String status;

        /**
         * 说明.
         */
        private final String explain;

        /**
         * 根据name获取.
         *
         * @param status status
         * @return 结果
         */
        public static OrderStatus getByStatus(final String status) {
            return Arrays.stream(OrderStatus.values()).filter(i -> i.getStatus().equals(status)).findFirst().orElse(null);
        }

    }

    /**
     * 交易类型.
     */
    @Getter
    @AllArgsConstructor
    public enum Type {

        /**
         * 支付宝.
         */
        ALI_APPLET("ALI_APPLET"),

        /**
         * 微信.
         */
        WECHAT_APPLET("WECHAT_APPLET");

        /**
         * type.
         */
        private final String type;

        /**
         * 根据type获取.
         *
         * @param type type
         * @return 结果
         */
        public static Type getByType(final String type) {
            return Arrays.stream(Type.values()).filter(i -> i.getType().equals(type)).findFirst().orElse(null);
        }

    }

    /**
     * 交易响应码.
     */
    @Getter
    @AllArgsConstructor
    public enum RespCode {

        /**
         * 100004：不支持该支付通道的交易.
         */
        CODE_100004("100004", "不支持该支付通道的交易"),

        /**
         * 100019：无可用渠道.
         */
        CODE_100019("100019", "无可用渠道"),

        /**
         * 100200：订单已支付成功，请勿重复支付.
         */
        CODE_100200("100200", "订单已支付成功，请勿重复支付"),

        /**
         * 100203：交易失败.
         */
        CODE_100203("100203", "交易失败"),

        /**
         * 100204：订单已过期，请使用新的订单号发起交易.
         */
        CODE_100204("100204", "订单已过期，请使用新的订单号发起交易"),

        /**
         * 100205：参数错误，校验不通过.
         */
        CODE_100205("100205", "订单已存在"),

        /**
         * 100206：订单不存在.
         */
        CODE_100206("100206", "订单不存在"),

        /**
         * 100207：交易已取消.
         */
        CODE_100207("100207", "交易已取消"),

        /**
         * 100208：订单已失败.
         */
        CODE_100208("100208", "订单已失败"),

        /**
         * 100209：文件大小超限.
         */
        CODE_100209("100209", "交易失败，黑名单用户"),

        /**
         * 100210：交易失败，非白名单用户.
         */
        CODE_100210("100210", "交易失败，非白名单用户"),

        /**
         * 100211：交易记录不存在.
         */
        CODE_100211("100211", "交易记录不存在"),

        /**
         * 100212：交易失败，风险受限.
         */
        CODE_100212("100212", "交易失败，风险受限"),

        /**
         * 100500：余额不足.
         */
        CODE_100500("100500", "余额不足"),

        /**
         * 100501：交易金额超限.
         */
        CODE_100501("100501", "交易金额超限"),

        /**
         * 100502：交易金额低于限额.
         */
        CODE_100502("100502", "交易金额低于限额"),

        /**
         * 100503：交易金额不正确.
         */
        CODE_100503("100503", "交易金额不正确"),

        /**
         * 100505：单日交易金额超限.
         */
        CODE_100505("100505", "单日交易金额超限"),

        /**
         * 100506：单笔交易金额超限.
         */
        CODE_100506("100506", "单笔交易金额超限"),

        /**
         * 100507：单月交易金额超限.
         */
        CODE_100507("100507", "单月交易金额超限"),

        /**
         * 100600：短信验证码错误.
         */
        CODE_100600("100600", "短信验证码错误"),

        /**
         * 100601：短信验证码失效.
         */
        CODE_100601("100601", "短信验证码失效"),

        /**
         * 100602：请确认是否发送短信,当前交易必须通过短信验证.
         */
        CODE_100602("100602", "请确认是否发送短信,当前交易必须通过短信验证"),

        /**
         * 200002：非法的交易.
         */
        CODE_200002("200002", "非法的交易"),

        /**
         * 200003：订单号已存在，请勿重复提交.
         */
        CODE_200003("200003", "订单号已存在，请勿重复提交"),

        /**
         * 200004：订单不存在.
         */
        CODE_200004("200004", "订单不存在"),

        /**
         * 200005：原订单金额校验不通过.
         */
        CODE_200005("200005", "原订单金额校验不通过"),

        /**
         * 200007：查询成功.
         */
        CODE_200007("200007", "查询成功"),

        /**
         * 200008：查询失败.
         */
        CODE_200008("200008", "查询失败"),

        /**
         * 200009：查询结果集为空.
         */
        CODE_200009("200009", "查询结果集为空"),

        /**
         * 2000010：批次号已存在.
         */
        CODE_2000010("2000010", "批次号已存在"),

        /**
         * 200011：订单数量超过单批次处理量.
         */
        CODE_200011("200011", "订单数量超过单批次处理量"),

        /**
         * 200012：请求太过频繁,请稍后再试.
         */
        CODE_200012("200012", "请求太过频繁,请稍后再试"),

        /**
         * 200015：不支持此支付类型.
         */
        CODE_200015("200015", "不支持此支付类型"),

        /**
         * 200017：订单关闭成功.
         */
        CODE_200017("200017", "订单关闭成功"),

        /**
         * 200018：订单关闭失败,请重试！.
         */
        CODE_200018("200018", "订单关闭失败,请重试！"),

        /**
         * 200108：交易主体从属关系异常.
         */
        CODE_200108("200108", "交易主体从属关系异常"),

        /**
         * 200109：业务订单不存在.
         */
        CODE_200109("200109", "业务订单不存在"),

        /**
         * 200110：业务订单状态异常.
         */
        CODE_200110("200110", "业务订单状态异常"),

        /**
         * 200111：支付金额超限.
         */
        CODE_200111("200111", "支付金额超限"),

        /**
         * 200112：业务订单已失效.
         */
        CODE_200112("200112", "业务订单已失效"),

        /**
         * 200113：该业务订单不支持部分支付.
         */
        CODE_200113("200113", "该业务订单不支持部分支付"),

        /**
         * 200114：业务订单已关闭.
         */
        CODE_200114("200114", "业务订单已关闭"),

        /**
         * 200115：非法交易.
         */
        CODE_200115("200115", "非法交易"),

        /**
         * 200116：存在成功/处理中订单,请勿重复提交.
         */
        CODE_200116("200116", "存在成功/处理中订单,请勿重复提交"),

        /**
         * 200117：订单已经分账不能发起退款/撤销.
         */
        CODE_200117("200117", "订单已经分账不能发起退款/撤销"),

        /**
         * 200118：订单金额不等于交易金额+营销金额.
         */
        CODE_200118("200118", "订单金额不等于交易金额+营销金额"),

        /**
         * 200119：订单金额+交易金额不能都为0.
         */
        CODE_200119("200119", "订单金额+交易金额不能都为0"),

        /**
         * 200120：营销账户信息不能为空.
         */
        CODE_200120("200120", "营销账户信息不能为空"),

        /**
         * 200201：商户状态异常，无法进行交易.
         */
        CODE_200201("200201", "商户状态异常，无法进行交易"),

        /**
         * 200203：商户与子商户关系不对应，无法进行交易.
         */
        CODE_200203("200203", "商户与子商户关系不对应，无法进行交易"),

        /**
         * 200204：门店信息不存在，无法进行交易.
         */
        CODE_200204("200204", "门店信息不存在，无法进行交易"),

        /**
         * 200205：终端商户信息不存在，无法进行交易.
         */
        CODE_200205("200205", "终端商户信息不存在，无法进行交易"),

        /**
         * 200206：请求ip白名单未配置.
         */
        CODE_200206("200206", "请求ip白名单未配置"),

        /**
         * 200207：账户状态异常.
         */
        CODE_200207("200207", "账户状态异常"),

        /**
         * 200209：门店信息不存在.
         */
        CODE_200209("200209", "门店信息不存在"),

        /**
         * 200210：设备信息不存在.
         */
        CODE_200210("200210", "设备信息不存在"),

        /**
         * 200302：产品渠道不能为空.
         */
        CODE_200302("200302", "产品渠道不能为空"),

        /**
         * 200401：交易非法，订单已完成.
         */
        CODE_200401("200401", "交易非法，订单已完成"),

        /**
         * 110701：商户限额校验不通过.
         */
        CODE_110701("110701", "商户限额校验不通过");

        /**
         * code.
         */
        private final String code;

        /**
         * 信息.
         */
        private final String message;

        /**
         * 根据code获取对应枚举.
         *
         * @param code code
         * @return MQTagEnum
         */
        public static RespCode fromCode(final String code) {
            return Arrays.stream(RespCode.values()).filter(i -> i.getCode().equals(code)).findFirst().orElse(null);
        }

    }

}
